package com.hh.admin.product.trustfinancial.service;

import java.sql.SQLException;

import org.apache.log4j.Logger;

import com.hh.admin.product.trustfinancial.form.ParamProductTrustBean;
import com.hh.admin.product.trustfinancial.form.ProductTrustForm;
import com.hh.admin.product.trustfinancial.form.ResultProductTrustBean;
import com.hh.common.ibatis.dao.IQueryDao;
import com.hh.common.ibatis.dao.IUpdateDao;
import com.hh.portal.products.form.ParamPortalProductsBean;

/**
 * 信托理财产品管理Service
 * 
 * @author 冯昌硕
 * @create 2013-1-8 上午12:18:52
 */
public class ProductTrustService {
    
    private static final Logger log = Logger.getLogger(ProductTrustService.class);
    
    private IQueryDao queryDao;

    private IUpdateDao updateDao;
    
    /**
     * 删除信托理财产品记录
     * @param id 产品ID
     * @return
     * @throws SQLException
     * @create 2013-1-8 下午9:18:47
     * @modify 2013-2-15 单条记录删除时也同时删除公共产品内容表的记录
     */
    public int deleteOneTrustProductInfo(int id, int productTypeId) throws SQLException {
        int delRs = -1;
        
        try {
            updateDao.startTransaction();
            delRs = updateDao.delete("producttrust.deleteTrustProductInfo", id);
            log.debug("[deleteOneTrustProductInfo] contentId=["+id+"] productTypeId=[" + productTypeId + "] [producttrust.deleteTrustProductInfo删除影响记录行数[" + delRs+ "]]");
            
            ParamPortalProductsBean paramBean = new ParamPortalProductsBean();
            paramBean.setProductContentId(id);
            paramBean.setProductTypeId(productTypeId);
            int delRs2 = updateDao.delete("commonProduct.deleteCommonProduct", paramBean);
            log.debug("[deleteOneTrustProductInfo] contentId=["+id+"] productTypeId=[" + productTypeId + "] [commonProduct.deleteCommonProduct删除影响记录行数[" + delRs2 + "]]");
            
            updateDao.commitTransaction();
        } finally {
            updateDao.endTransaction();
        }
        
        return delRs;
    }
    
    /**
     * 批量删除产品记录
     * @param ids 要删除的产品ID
     * @return
     * @throws SQLException
     * @create 2013-1-8 下午9:22:51
     * @modify 2013-2-15 批量删除时也同时删除公共产品内容表的记录
     */
    public int deleteManyProductInfo(Integer[] ids, int productTypeId) throws SQLException {
        int result = -1;
        
        try {
            updateDao.startTransaction();
            updateDao.startBatch();
            
            if((ids == null) || (ids.length <= 0)) {
                log.info("批量删除[producttrust.deleteTrustProductInfo]参数数组为空，不作处理");
                return result;
            }
            
            // 批处理删除内容表记录
            for(Object paramObj : ids) {
                updateDao.delete("producttrust.deleteTrustProductInfo", paramObj);
            }
            
            // 批处理删除公共内容表记录
            log.debug("[deleteManyProducttype]批量删除公共内容表记录，产品类型[" + productTypeId + "]");
            for(Integer paramObj : ids) {
                ParamPortalProductsBean paramBean = new ParamPortalProductsBean();
                paramBean.setProductContentId(paramObj);
                paramBean.setProductTypeId(productTypeId);
                updateDao.delete("commonProduct.deleteCommonProduct", paramBean);
            }
            
            result = updateDao.executeBatch();
            
            updateDao.commitTransaction();
        } catch(SQLException e) {
            log.error("[deleteManyProductInfo] 批处理异常： " + e.toString());
            throw e;
        } finally {
            updateDao.endTransaction();
        }
        
        return result;
    }
    
    /**
     * 添加产品记录
     * @param form
     * @return
     * @throws SQLException
     * @create 2013-1-8 下午9:25:34
     */
    public int insertTrustProduct(ProductTrustForm form) throws SQLException {
        ParamProductTrustBean paramBean = new ParamProductTrustBean();
        paramBean.setProductName(form.getProductName());       // 产品名称
        paramBean.setIssuer(form.getIssuer());                 // 发行机构
        paramBean.setProjectManager(form.getProjectManager()); // 项目经理
        paramBean.setProductType(form.getProductType());       // 产品类型
        paramBean.setProductStatus(form.getProductStatus());   // 产品状态
        paramBean.setCurrency(form.getCurrency());             // 理财币种
        paramBean.setManagementType(form.getManagementType()); // 投资管理类型
        paramBean.setIssueDate(form.getIssueDate());           // 发行时间
        paramBean.setEndDate(form.getEndDate());               // 发行结束时间
        paramBean.setPlaceTarget(form.getPlaceTarget());       // 发售对象
        paramBean.setIssuesSize(form.getIssuesSize());         // 发行规模
        paramBean.setStartAmount(form.getStartAmount());       // 投资门槛
        paramBean.setTimeLimit(form.getTimeLimit());           // 产品期限
        paramBean.setTimeLimitType(form.getTimeLimitType());   // 期限类型
        paramBean.setExpectedProfit(form.getExpectedProfit()); // 预期年收益率 %
        paramBean.setEarningsType(form.getEarningsType());     // 收益类型
        paramBean.setBreakEven(form.getBreakEven());           // 是否保本(0-否；1-是)
        paramBean.setInvestmentStyle(form.getInvestmentStyle()); // 投资方式
        paramBean.setFundInvestment(form.getFundInvestment()); // 资金投向
        paramBean.setTrustMoney(form.getTrustMoney());         // 资金托管费率 %
        paramBean.setSellFee(form.getSellFee());               // 销售手续费率 %
        paramBean.setFoundedDate(form.getFoundedDate());       // 成立日期
        paramBean.setFoundedSize(form.getFoundedSize());       // 成立规模
        paramBean.setDueDate(form.getDueDate());               // 到期日期
        paramBean.setRealProfit(form.getRealProfit());         // 实际年收益率
        paramBean.setPlaceArea(form.getPlaceArea());           // 发行地
        paramBean.setFundsAppliaction(form.getFundsAppliaction());   // 资金运用情况
        paramBean.setCreditEnhancement(form.getCreditEnhancement()); // 信用增级情况
        paramBean.setOtherInformation(form.getOtherInformation());   // 其他相关信息
        
        paramBean.setStatus(form.getStatus());           // 内容状态（0-不可用；1-可用）
        paramBean.setCreaterUser(form.getCreaterUser()); // 内容创建人
        
        Integer productTrustAddRs = -1;
        try {
            updateDao.startTransaction();
            productTrustAddRs = (Integer) updateDao.insert("producttrust.insertContent", paramBean);
            log.debug("[insertTrustProduct] producttrust.insertContent result = [" + productTrustAddRs + "]");
            
            ParamPortalProductsBean portalParam = new ParamPortalProductsBean();
            portalParam.setProductTypeId(form.getProductTypeId()); // 产品类型ID,参照表product_type的id字段
            portalParam.setStatus(form.getStatus());               // 内容状态(0-草稿;1-发布)
            portalParam.setProductName(form.getProductName());     // 产品名称
            portalParam.setProductContentId(productTrustAddRs);    // 产品记录内容ID
            
            int portalInsertRs = (Integer) updateDao.insert("commonProduct.insertCommonProduct", portalParam);
            log.debug("[insertTrustProduct] commonProduct.insertCommonProduct result = [" + portalInsertRs + "]");
            
            updateDao.commitTransaction();
        } finally {
            updateDao.endTransaction();
        }
        
        return productTrustAddRs;
    }
    
    /**
     * 根据记录ID获取信托理财产品详情
     * @param id
     * @return
     * @throws ClassCastException
     * @throws SQLException
     * @create 2013-1-9 上午12:12:36
     */
    public ResultProductTrustBean getTrustProductDetail(int id) throws ClassCastException, SQLException {
        return queryDao.queryForObject("producttrust.selTrustProductInfo", id, ResultProductTrustBean.class);
    }
    
    /**
     * 更新记录
     * @param form
     * @return
     * @throws SQLException
     * @create 2013-1-9 上午12:15:42
     * @modify 2013-2-15 更新时也同时更新公共产品内容表的记录
     */
    public int updateTrustProductInfo(ProductTrustForm form) throws SQLException {
        ParamProductTrustBean paramBean = new ParamProductTrustBean();
        paramBean.setProductName(form.getProductName());       // 产品名称
        paramBean.setIssuer(form.getIssuer());                 // 发行机构
        paramBean.setProjectManager(form.getProjectManager()); // 项目经理
        paramBean.setProductType(form.getProductType());       // 产品类型
        paramBean.setProductStatus(form.getProductStatus());   // 产品状态
        paramBean.setCurrency(form.getCurrency());             // 理财币种
        paramBean.setManagementType(form.getManagementType()); // 投资管理类型
        paramBean.setIssueDate(form.getIssueDate());           // 发行时间
        paramBean.setEndDate(form.getEndDate());               // 发行结束时间
        paramBean.setPlaceTarget(form.getPlaceTarget());       // 发售对象
        paramBean.setIssuesSize(form.getIssuesSize());         // 发行规模
        paramBean.setStartAmount(form.getStartAmount());       // 投资门槛
        paramBean.setTimeLimit(form.getTimeLimit());           // 产品期限
        paramBean.setTimeLimitType(form.getTimeLimitType());   // 期限类型
        paramBean.setExpectedProfit(form.getExpectedProfit()); // 预期年收益率 %
        paramBean.setEarningsType(form.getEarningsType());     // 收益类型
        paramBean.setBreakEven(form.getBreakEven());           // 是否保本(0-否；1-是)
        paramBean.setInvestmentStyle(form.getInvestmentStyle()); // 投资方式
        paramBean.setFundInvestment(form.getFundInvestment()); // 资金投向
        paramBean.setTrustMoney(form.getTrustMoney());         // 资金托管费率 %
        paramBean.setSellFee(form.getSellFee());               // 销售手续费率 %
        paramBean.setFoundedDate(form.getFoundedDate());       // 成立日期
        paramBean.setFoundedSize(form.getFoundedSize());       // 成立规模
        paramBean.setDueDate(form.getDueDate());               // 到期日期
        paramBean.setRealProfit(form.getRealProfit());         // 实际年收益率
        paramBean.setPlaceArea(form.getPlaceArea());           // 发行地
        paramBean.setFundsAppliaction(form.getFundsAppliaction());   // 资金运用情况
        paramBean.setCreditEnhancement(form.getCreditEnhancement()); // 信用增级情况
        paramBean.setOtherInformation(form.getOtherInformation());   // 其他相关信息
        
        paramBean.setStatus(form.getStatus());           // 内容状态（0-不可用；1-可用）
        paramBean.setId(form.getId());
        
        int result = -1;
        try {
            updateDao.startTransaction();
            result = updateDao.update("producttrust.updateTrustProduct", paramBean);
            
            ParamPortalProductsBean param = new ParamPortalProductsBean();
            param.setProductName(form.getProductName());     // 产品名称
            param.setStatus(form.getStatus());               // 内容状态：0-草稿；1-发布
            param.setProductTypeId(form.getProductTypeId()); // 产品类型ID,参照表product_type的id字段
            param.setProductContentId(form.getId());         // 产品记录内容ID
            updateDao.update("commonProduct.updateCommonProduct", param);
            
            updateDao.commitTransaction();
        } finally {
            updateDao.endTransaction();
        }
        
        return result;
    }

    public void setQueryDao(IQueryDao queryDao) {
        this.queryDao = queryDao;
    }

    public void setUpdateDao(IUpdateDao updateDao) {
        this.updateDao = updateDao;
    }

}
